/*
 ============================================================================
 Name        : CRNG.c
 Author      : Carlos Sancho & Armando Gomes
 Version     : 08/02/2012
 Description : Trabalho realizado no âmbito da Unidade Curricular de
                Conceitos de Programação para a Segurança 
                Módulo de Python.
                Este Código tem como objectivo demonstrar a facilidade
                e eficiência da integração de bibliotecas programadas
                com o recurso à Linguagem C, em código Python.
Docente      :  José Jasnau Caeiro
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void swap(int* x, int* y);


/*
    This function executes the generation of N (this value is 
    given by the argument number_of_runs) pseudo random numbers.
*/
int pseudo_rand(int number_of_runs) {

    // Initialize timer
	clock_t start = clock();

    // Initialize random number generator
	srand ( (unsigned int)time ( NULL ) );

	int i = 0;
	int table[1000] = { 9 };
	int control[10] = { 0 };

	int y = 0;
	int x = 0;
	int n = 0;
	int z1, z2, z3, z4;

    /*
        This function populates a new array with specific limits. In this
        case, it populates the table with the same amount of different
        digits.
    */
	while(i < 1000){
		y = rand() % 10;
		if(control[y] < 100){
			table[x] = y;
			control[y] = control[y];
			x++;
			i++;
		}
	};

	int p = rand() % 1000;

	for(i = 0; i <= number_of_runs; i++) {
		z1 = z2 = z3 = z4 = 0;

		z1 = table[p];
		swap(&table[0], &table[p]);

		if(p < 999){
			z2 = table[p + 1];
			swap(&table[0], &table[p + 1]);
		} else{
			z2 = table[0];
		}

		if(p < 998){
			z3 = table[p + 2];
			swap(&table[0], &table[p + 2]);
		} else{
			z3 = table[0];
		}

		if(p < 997){
			z4 = table[p + 3];
			swap(&table[0], &table[p + 3]);
		} else{
			z4 = table[0];
		}

		n = (z1 << 12) | (z2 << 8) | (z3 << 4) | z4;
		p = z1 * 100 + z2 * 10 + z3;
		//printf("%d\n", n);
		if(p >= 999) p = rand() % 1000;
	}

	printf("Time elapsed: %f\n", ((double)clock() - start) / CLOCKS_PER_SEC);
    return 0;
}

/*
    This function swaps the pointees
    values of the given pointers.
*/
void swap(int* x, int* y) {
	int temp = *x;
	*x = *y;
	*y = temp;
}
